#include"server.hpp"
#include"logger.hpp"
#include"socket.hpp"
using AcceptorCallback=std::function<void(int)>;
class Acceptor{
private:
    /*监听套接字的读事件回调函数--获取新连接，调用_accept_callback函数进行新连接处理*/
    void ReadHandler(){
        int newfd=_socket.Accept();
        if(newfd<0)  return;
        if(_accept_callback) _accept_callback(newfd);
    }
    int ServerCreate(uint16_t port){
        bool ret=_socket.CreateServer(port);
        assert(ret==true);
        return _socket.Get_fd();
        
    }
public:
    /*不能将启动读事件监控，放到构造函数中，必须在设置回调函数后，再去启动*/
    /*否则有可能造成启动监控后，立即有事件，处理的时候，回调函数还没设置：新连接得不到处理，且资源泄露*/
    Acceptor(EventLoop*loop,uint16_t port):_loop(loop),_socket(ServerCreate(port)),_channel(_socket.Get_fd(),_loop)
    {
        _channel.SetReadCallback(std::bind(&Acceptor::ReadHandler,this));
    }
    void SetAccept(const AcceptorCallback&cb){_accept_callback=cb;}
    void Listen(){_channel.EnableRead();}
private:
    Socket _socket;//用于创建监听套接字
    EventLoop* _loop;//用于对监听套接字进行事件监控
    Channel _channel;//用于对监听套接字进行事件管理
    AcceptorCallback _accept_callback;
};